Flutter tonic DartState
介绍
tonic 是一个 C++ 工具库,对 DartVM API 进行了一些简化和封装。
DartState 与一个具体的 Dart Isolate 想关联。持有 DartState 就相当于持有了 Isolate,并且 tonic 建议采用弱引用持有。
注意一个细节:在 DartVM 之外,对 Isolate 的引用类是 Dart_Isolate。
核心成员
DartState 有几个核心成员,代表了 Isolate 的核心能力。
DartClassLibrary
跨层从 C/C++ 访问 Dart 中的一些类,tonic 提供了一个抽象模块,统一管理。
DartMessageHandler
DartMessageHandler 也是 tonic 提供的封装,而并非 DartVM 中的 Isolate MessageHandler。
DartMessageHandler 通过回调注入的方式,提供了对消息队列的响应。
FileLoader
tonic 提供的跨平台文件加载模块。
DartMessageHandler 使用场景
UIDartState::GetLastError,获取 Isolate 的最后一次报错:
tonic::DartErrorHandleType UIDartState::GetLastError() {
tonic::DartErrorHandleType error = message_handler().isolate_last_error();
if (error == tonic::kNoError) {
error = microtask_queue_.GetLastError();
}
return error;
}
DartIsolate 设置 MessageHandlingTaskRunner,这是一个非常核心的行为:
void DartIsolate::SetMessageHandlingTaskRunner(
fml::RefPtr<fml::TaskRunner> runner) {
if (!IsRootIsolate() || !runner) {
return;
}
message_handling_task_runner_ = runner;
message_handler().Initialize([runner](std::function<void()> task) {
auto task_queues = fml::MessageLoopTaskQueues::GetInstance();
task_queues->RegisterTask(
runner->GetTaskQueueId(),
[task = std::move(task)]() {
task();
},
fml::TimePoint::Now(), fml::TaskSourceGrade::kDartMicroTasks);
});
}